home *** CD-ROM | disk | FTP | other *** search
/ C/C++ Users Group Library 1996 July / C-C++ Users Group Library July 1996.iso / listings / v_02_04 / 2n04050a < prev    next >
Text File  |  1991-02-25  |  6KB  |  212 lines

  1.  
  2. /*
  3.  * PROGRAM     :  CMOSDUMP.C
  4.  * AUTHOR      :  Mark R. Nelson
  5.  * DATE        :  January 13, 1990
  6.  * DESCRIPTION :  This program dumps out the contents of
  7.  *             the IBM PC-AT CMOS RAM.  The contents
  8.  *             are printed in raw format, then displayed
  9.  *             using the same interpretations the BIOS
  10.  *             makes regarding their contents.  This
  11.  *             code should compile under Microsoft C
  12.  *             5.1 and 6.0, and Turbo C/C++ 2.0 and up.
  13.  */
  14.  
  15. #include <stdio.h>
  16. #include <stdlib.h>
  17. #include <ctype.h>
  18. #include <conio.h>
  19. #include <dos.h>
  20.  
  21. #ifdef M_I86    /* Microsoft C */
  22. #define enable            _enable
  23. #define disable           _disable
  24. #define inportb( a )      inp( a )
  25. #define outportb( a, b )  outp( a, b )
  26. #endif
  27.  
  28. int main( void );
  29. unsigned char read_cmos( int location );
  30. void dump_cmos( void );
  31. void dump_setup( void );
  32.  
  33. int main()
  34. {
  35.     printf( "\n  ***  CMOS RAM Contents ***\n\n" );
  36.     dump_cmos();
  37.     dump_setup();
  38.     return( 0 );
  39. }
  40.  
  41. /*
  42.  * This routine assumes that the machine/compiler 
  43.  * combination is fast enough to test for the absence 
  44.  * of the UIP bit, then perform an outportb and 
  45.  * another inportb in less than 244 microseconds. This
  46.  * may not always be the case.  If accuracy of reading 
  47.  * the clock bytes is critical, the BIOS functions 
  48.  * should be used, or code the test portion in assembly 
  49.  * language.  If the compiler in question can generate 
  50.  * inline code for input and output instructions, it 
  51.  * probably will be fast enough.
  52.  */
  53.  
  54. unsigned char read_cmos( int location )
  55. {
  56.     register unsigned char return_value;
  57.  
  58.     if ( location < 10 ) {
  59.         for ( ; ; ) {
  60.             outportb( 0x70, 10 );
  61.             disable();
  62.             if ( (inportb( 0x71 ) & 0x80) == 0 ) {
  63.                 outportb( 0x70, location );
  64.                 return_value = ( unsigned char ) 
  65.                                inportb( 0x71 );
  66.                 enable();
  67.                 return( return_value );
  68.             }
  69.             enable();
  70.         }
  71.     }
  72.     outportb( 0x70, location );
  73.     return( ( unsigned char ) inportb( 0x71 ) );
  74. }
  75.  
  76. void dump_cmos()
  77. {
  78.     int i;
  79.     int j;
  80.     int val;
  81.  
  82.     printf( "     " );
  83.     for ( i = 0 ; i < 16 ; i++ )
  84.         printf( " %02x", i );
  85.     printf( "\n      " );
  86.     for ( i = 0 ; i < 16 ; i++ )
  87.         printf( "-- " );
  88.     printf( "\n" );
  89.     for ( i = 0 ; i < 4 ; i++ ) {
  90.         printf( "%04x:", i * 16 );
  91.         for ( j = i * 16 ; j < ( i + 1 ) * 16 ; j++ )
  92.             printf( " %02x", read_cmos( j ) );
  93.         printf( " " );
  94.         for ( j = i * 16 ; j < ( i + 1 ) * 16 ; j++ ) {
  95.             val = read_cmos( j );
  96.             if ( isprint( val ) )
  97.                 putchar( val );
  98.             else
  99.                 putchar( '.' );
  100.         }
  101.         printf( "\n" );
  102.     }
  103.     printf( "\n" );
  104. }
  105.  
  106. void read_time( unsigned char dest[ 3 ] )
  107. {
  108.     unsigned char current_seconds;
  109.     int i;
  110.  
  111.     do {
  112.         for ( i = 0 ; i < 3 ; i++ )
  113.             dest[ i ] = read_cmos( i * 2 );
  114.             current_seconds = read_cmos( 0 );
  115.     } while ( current_seconds != dest[ 0 ] );
  116. }
  117.  
  118. char *floppy_type( int drive_number )
  119. {
  120.     unsigned int drive;
  121.  
  122.     static char *drives[] = { "None", "360K", "1.2M",
  123.                               "720K", "1.44M" };
  124.     if ( drive_number == 1 )
  125.         drive = read_cmos( 16 ) >> 4;
  126.     else
  127.         drive = read_cmos( 16 ) & 15;
  128.     if ( drive < 5 )
  129.         return( drives[ drive ] );
  130.     else
  131.         return( "?" );
  132. }
  133.  
  134. char *hard_type( int drive_number )
  135. {
  136.     unsigned int drive;
  137.     char buffer[ 81 ];
  138.  
  139.     if ( drive_number == 1 ) {
  140.         drive = read_cmos( 18 ) >> 4;
  141.         if ( drive == 15 )
  142.             drive = read_cmos( 25 );
  143.     } else {
  144.         drive = read_cmos( 18 ) & 15;
  145.         if ( drive == 15 )
  146.             drive = read_cmos( 26 );
  147.     }
  148.     if ( drive != 0)
  149.         return( itoa( drive, buffer, 10 ) );
  150.     else
  151.         return( "None" );
  152. }
  153.  
  154. int floppy_count( void )
  155. {
  156.     return( ( read_cmos( 20 ) >> 6 ) + 1 );
  157. }
  158.  
  159. char *display_type( void )
  160. {
  161.     static char *displays[] = { "VGA/EGA",
  162.                                 "Color 40 column",
  163.                                 "Color 80 Column",
  164.                                 "Monochrome" };
  165.  
  166.     return( displays[ ( read_cmos( 20 ) >> 4 ) & 3 ] );
  167. }
  168.  
  169. char *months[] = { "January", "February", "March",
  170.                    "April", "May", "June", "July",
  171.                    "August", "September", "October",
  172.                    "", "", "", "", "", "",
  173.                    "November", "December" };
  174.  
  175. void dump_setup()
  176. {
  177.     unsigned char time[ 3 ];
  178.     int memory;
  179.     int checksum;
  180.  
  181.     read_time( time );
  182.     printf( "Current Time      :  %02x:%02x:%02x    ",
  183.             time[ 2 ], time[ 1 ], time[ 0 ] );
  184.     printf( "Current Date    :  %s %02x, %x%02x\n",
  185.             months[ read_cmos( 8 ) - 1 ],
  186.             read_cmos( 7 ),
  187.             read_cmos( 50 ),
  188.             read_cmos( 9 ) );
  189.     printf( "Alarm Time        :  %x:%02x:%02x\n",
  190.             read_cmos( 5 ), read_cmos( 3 ),
  191.             read_cmos( 1 ) );
  192.     printf( "Floppy drive 1    :  %-12s", floppy_type( 1 ) );
  193.     printf( "Floppy drive 2  :  %s\n", floppy_type( 2 ) );
  194.     printf( "Fixed disk 1      :  %-12s", hard_type( 1 ) );
  195.     printf( "Fixed disk 2    :  %s\n", hard_type( 2 ) );
  196.     printf( "No. of floppies   :  %d\n", floppy_count() );
  197.     printf( "Primary display   :  %s\n", display_type() );
  198.     printf( "Math Coprocessor  :  %s\n",
  199.             ( read_cmos( 20 ) & 2 ) ? "Yes" : "No" );
  200.     printf( "Diskettes         :  %s\n",
  201.             ( read_cmos( 20 ) & 1 ) ? "Installed" : "No" );
  202.     memory = read_cmos( 21 ) + ( read_cmos( 22 ) << 8 );
  203.     printf( "Standard RAM      :  %dK\n", memory );
  204.     memory = read_cmos( 23 ) + ( read_cmos( 24 ) << 8 );
  205.     printf( "Extended RAM      :  %dK\n", memory );
  206.     memory = read_cmos( 48 ) + ( read_cmos( 49 ) << 8 );
  207.     printf( "Extended RAM      :  %dK\n", memory );
  208.     checksum = read_cmos( 47 ) + ( read_cmos( 46 ) << 8 );
  209.     printf( "Checksum          :  %04x\n", checksum );
  210. }
  211.  
  212.